package com.qf.hospital.controller;

import com.github.pagehelper.PageInfo;
import com.qf.hospital.dto.SysUserDTO;
import com.qf.hospital.entity.SysUser;
import com.qf.hospital.enums.HospitalExceptionEnums;
import com.qf.hospital.service.SysUserService;
import com.qf.hospital.vo.R;
import com.qf.hospital.vo.SysUserVO;
import com.qf.hospital.vo.UserRoleVO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import java.util.ArrayList;
import java.util.List;

/**
 * @author zjw
 * @description 用户管理功能
 * @date 2021/10/18 9:23
 */
@RestController
public class UserController {

    private Logger log = LoggerFactory.getLogger(UserController.class);

    @Autowired
    private SysUserService sysUserService;

    /**
     *  查询全部用户信息
     *  接收参数，也可以自行封装一个DTO接收
     * @param realname 昵称
     * @param loginname 登录名
     * @param address 地址
     * @param phone 手机号
     * @param identity 身份证号
     * @param page 当前页
     * @param limit 每页条数
     * @return
     */
    @GetMapping("/user/selectAllUser")
    public R selectAllUser(String realname, String loginname, String address, String phone, String identity,
                           @RequestParam(defaultValue = "1")Integer page,
                           @RequestParam(defaultValue = "10")Integer limit){
        //1. 调用sysUserService查询全部用户信息
        PageInfo<SysUser> pageInfo = sysUserService.selectAllUser(realname,loginname,address,phone,identity,page,limit);

        //2. 获取数据总条数
        long count = pageInfo.getTotal();

        //3. 获取展示的数据
        List<SysUser> sysUserList = pageInfo.getList();
        List<SysUserVO> data = new ArrayList<>();
        for (SysUser sysUser : sysUserList) {
            SysUserVO vo = new SysUserVO();
            BeanUtils.copyProperties(sysUser,vo);
            vo.setPwd("");
            data.add(vo);
        }

        //4. 响应数据
        return R.ok(count,data);
    }


    /**
     *  添加用户信息
     * @param sysUserDTO
     * @param bindingResult
     * @return
     */
    @PostMapping("/user/addUser")
    public R addUser(@Valid SysUserDTO sysUserDTO, BindingResult bindingResult){
        //1. 校验参数
        if (bindingResult.hasErrors()) {
            // 参数不合法
            String msg = bindingResult.getFieldError().getDefaultMessage();
            log.info("【添加用户信息】 参数不合法！ msg = {}",msg);
            return R.error(HospitalExceptionEnums.REQUEST_PARAMETER_ERROR.getCode(),msg);
        }

        //2. 封装实体类
        SysUser sysUser = new SysUser();
        BeanUtils.copyProperties(sysUserDTO,sysUser);

        //3. 调用Service保存
        sysUserService.addUser(sysUser);

        //4. 返回
        return R.ok("添加用户信息成功！");
    }


    /**
     * # 分配角色信息
     * @param userid
     * @return
     */
    @GetMapping("/user/initUserRole")
    public R initUserRole(Integer userid){
        //1. 校验参数
        if(userid == null || userid <= 0){
            log.info("【分配角色信息】 参数不合法！");
            return R.error(HospitalExceptionEnums.REQUEST_PARAMETER_ERROR);
        }

        //2. 调用Service查询数据
        List<UserRoleVO> data = sysUserService.initUserRole(userid);

        //3. 响应
        return R.ok(data);
    }


    /**
     * 分配角色信息
     * @param userid  用户id
     * @param ids   角色的全部id
     * @return
     */
    @PostMapping("/user/saveUserRole")
    public R saveUserRole(Integer userid,Integer[] ids){
        //1. 参数校验
        if(userid == null || userid <= 0){
            log.info("【分配角色信息】 参数不合法！");
            return R.error(HospitalExceptionEnums.REQUEST_PARAMETER_ERROR);
        }

        //2. 调用service分配角色
        sysUserService.saveUserRole(userid,ids);

        //3. 返回
        return R.ok("分配角色信息成功！");
    }



}
